package cn.szv5.register.server;

import lombok.Data;

/**
 * 应用模块名称<p>
 * 服务实例<p>
 * Copyright: Copyright (C) 2022 , Inc. All rights reserved. <p>
 * Company: 阿飞工作室<p>
 *
 * @author Carl
 * @since 2022/2/8 10:45
 */
@Data
public class ServiceInstance {

    /**
     * 判断一个服务实例不再存活的周期
     */
    private static final Long NOT_ALIVE_PERIOD = 90 * 1000L;

    /**
     * 服务名称
     */
    private String serviceName;
    /**
     * 服务所在机器的ip地址
     */
    private String ip;

    /**
     * 服务所在机器的主机名
     */
    private String hostname;

    /**
     * 服务监听的端口号
     */
    private int port;

    /**
     * 服务实例ID
     */
    private String serviceInstanceId;

    /**
     * 契约
     */
    private Lease lease;

    public ServiceInstance() {
        this.lease = new Lease();
    }

    /**
     * 服务续约
     */
    public void renew() {
        this.lease.renew();
    }

    /**
     * 服务实例是否存活
     */
    public boolean isAlive() {
        return this.lease.isAlive();
    }

    public class Lease {

        /**
         * 最近一次心跳的时间
         */
        private volatile long latestHeartbeatTime = System.currentTimeMillis();

        /**
         * 续约
         */
        public void renew() {
            this.latestHeartbeatTime = System.currentTimeMillis();
            System.out.println("服务实例【" + serviceInstanceId + "】,进行续约:" + latestHeartbeatTime);
        }

        /**
         * 服务实例是否存活
         *
         * @return
         */
        public Boolean isAlive() {
            long currentTime = System.currentTimeMillis();
            if (currentTime - latestHeartbeatTime > NOT_ALIVE_PERIOD) {
                System.out.println("服务实例【" + serviceInstanceId + "】,不再存活");
                return false;
            }
            System.out.println("服务实例【" + serviceInstanceId + "】,保持存活");
            return true;
        }
    }
}
